﻿using DataGridViewDemo2_PreComand检查;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        DataTable dt2 = new DataTable();// 1、第一步：创建 DataTable 变量
        private void Form1_Load(object sender, EventArgs e)
        {
            dt2.Columns.Add("作业类型");//2、第二步：添加表头
            dt2.Columns.Add("取货巷道号");//2、第二步：添加表头
            dt2.Columns.Add("卸货巷道号");//2、第二步：添加表头
            dt2.Columns.Add("起点设备号");
            dt2.Columns.Add("终点设备号");
            dt2.Columns.Add("取货排");
            dt2.Columns.Add("取货列");
            dt2.Columns.Add("取货层");
            dt2.Columns.Add("卸货排");
            dt2.Columns.Add("卸货列");
            dt2.Columns.Add("卸货层");
            dataGridView2.DataSource = dt2;//4、第四步：绑定数据源

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dgv"></param>
        /// <returns></returns>
        private string readdgv(DataGridView dgv)
        {
            //string Task_No;


                string Load_Laneway_No;//取货巷道号   
            string UnLoad_Laneway_No;//卸货巷道号   
            string Inlet_Station_No;//起始设备号         
            
            string Outlet_Station_No;//终点设备号
            string Load_Line;
            string Load_Col;
            string Load_Layer;
            string Unload_Line;
            string Unload_Col;
            string Unload_Layer;
            string str = null;

            // 假设getjob_style是一个类实例，并且有一个公共属性jobstyle
            // 假设Job_Style是一个字符串变量，用于存储上一个非空值
            string Job_Style = string.Empty; // 初始化为空字符串
            for (int i = 0; i < dgv.Rows.Count-2; i++)
            {
                // 检查DataGridView中的第一个单元格的值
                string currentValue = dgv.Rows[i].Cells[0].Value?.ToString() ?? string.Empty;

                // 如果当前值不为空，则更新Job_Style和getjob_style.jobstyle
                if (!string.IsNullOrEmpty(currentValue))
                {
                    Job_Style = currentValue;
                    // 假设getjob_style是一个已经存在的实例
                    getjob_style.jobstyle = Job_Style;
                  //  MessageBox.Show(getjob_style.jobstyle);
                }
                // 如果当前值为空，则getjob_style.jobstyle保持上一个非空值
                else if (!string.IsNullOrEmpty(Job_Style))
                {
                    // 如果需要，可以在这里更新getjob_style.jobstyle为上一个非空值
                    getjob_style.jobstyle = Job_Style;
                }

                

                    String strtmp;


                if (dgv != null) {

                try
                {
                        Load_Laneway_No = dgv.Rows[i].Cells[1].Value.ToString();
                        UnLoad_Laneway_No = dgv.Rows[i].Cells[2].Value.ToString();

                        Inlet_Station_No = dgv.Rows[i].Cells[3].Value.ToString();
                    Outlet_Station_No = dgv.Rows[i].Cells[4].Value.ToString();
                    getStr load_Line = new getStr(dgv.Rows[i].Cells[5].Value.ToString());
                    getStr load_col = new getStr(dgv.Rows[i].Cells[6].Value.ToString());
                    getStr load_layer = new getStr(dgv.Rows[i].Cells[7].Value.ToString());
                    getStr unload_line = new getStr(dgv.Rows[i].Cells[8].Value.ToString());
                    getStr unload_col = new getStr(dgv.Rows[i].Cells[9].Value.ToString());
                    getStr unload_lay = new getStr(dgv.Rows[i].Cells[10].Value.ToString());
//
                    strtmp = $"\"CoorCheck\"(作业类型:={getjob_style.jobstyle},\r\n            取货巷道:={Load_Laneway_No},\r\n            卸货巷道:={UnLoad_Laneway_No},\r\n            取货排_开始:={load_Line.first},\r\n            取货排_结束:={load_Line.end},\r\n            取货列_开始:={load_col.first},\r\n            取货列_结束:={load_col.end},\r\n            取货层_开始:={load_layer.first},\r\n            取货层_结束:={load_layer.end},\r\n            起始设备号:={Inlet_Station_No},\r\n            目的设备号:={Outlet_Station_No},\r\n            卸货排_开始:={unload_line.first},\r\n            卸货排_结束:={unload_line.end},\r\n            卸货列_开始:={unload_col.first},\r\n            卸货列_结束:={unload_col.end},\r\n            卸货层_开始:={unload_lay.first},\r\n            卸货层_结束:={unload_lay.end},\r\n            Command:=#Command,\r\n            OK=>#Result[{i}]);\r\n  "; ;
                    str = str + strtmp;

                }
                catch { }
                }

            }
            return str;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = readdgv(dataGridView2);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            dt2.Clear();
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Paste(dataGridView2, "", 0, false);
        }


        #region 粘贴
        /*
         DataGridView dgv:
这个参数代表了一个 DataGridView 控件，它是 .NET 中用于显示和编辑表格数据的一个控件。在这个方法中，数据将从剪贴板粘贴到这个 DataGridView 控件中。
string pasteText:
这个参数用于接收要粘贴的文本数据。如果 kind 参数的值是 0，那么这个文本将从剪贴板中获取。否则，它应该是方法调用时传入的文本数据。
int kind:
这个参数用来指示粘贴操作的类型。根据代码中的注释，kind 为 0 时表示从剪贴板获取数据，为 -1 时可能表示其他类型的粘贴操作。这个参数的具体含义可能依赖于你的程序的其他部分。
bool b_cut:
这个参数指示粘贴操作是否是剪切操作的一部分。如果为 true，则在粘贴数据后，剪贴板的内容将被清空，这通常发生在剪切操作中，因为你已经将数据从原始位置移动到了新位置。
         
         */

        public int Paste(DataGridView dgv, string pasteText, int kind, bool b_cut)
        {
            try
            {
                if (kind == 0)
                {
                    pasteText = Clipboard.GetText();
                }
                if (string.IsNullOrEmpty(pasteText))
                    return -1;
                int rowNum = 0;
                int columnNum = 0;
                //获得当前剪贴板内容的行、列数
                for (int i = 0; i < pasteText.Length; i++)
                {
                    if (pasteText.Substring(i, 1) == "\t")
                    {
                        columnNum++;
                    }
                    if (pasteText.Substring(i, 1) == "\n")
                    {
                        rowNum++;
                    }
                }
                Object[,] data;
                //粘贴板上的数据来自于EXCEL时，每行末都有\n，在DATAGRIDVIEW内复制时，最后一行末没有\n
                if (pasteText.Substring(pasteText.Length - 1, 1) == "\n")
                {
                    rowNum = rowNum - 1;
                }
                columnNum = columnNum / (rowNum + 1);
                // data = new object[rowNum + 1, columnNum + 1];
                data = new object[rowNum + 1, columnNum + 1];//在博图中复制时会多出一行

                String rowStr;
                //对数组赋值
                for (int i = 0; i < (rowNum + 1); i++)
                {
                    for (int colIndex = 0; colIndex < (columnNum + 1); colIndex++)
                    {
                        rowStr = null;
                        //一行中的最后一列
                        if (colIndex == columnNum && pasteText.IndexOf("\r") != -1)
                        {
                            rowStr = pasteText.Substring(0, pasteText.IndexOf("\r"));
                        }
                        //最后一行的最后一列
                        if (colIndex == columnNum && pasteText.IndexOf("\r") == -1)
                        {
                            rowStr = pasteText.Substring(0);
                        }
                        //其他行列
                        if (colIndex != columnNum)
                        {
                            rowStr = pasteText.Substring(0, pasteText.IndexOf("\t"));
                            pasteText = pasteText.Substring(pasteText.IndexOf("\t") + 1);
                        }
                        if (rowStr == string.Empty)
                            rowStr = null;
                        data[i, colIndex] = rowStr;
                    }
                    //截取下一行数据
                    pasteText = pasteText.Substring(pasteText.IndexOf("\n") + 1);
                }
                /*检测值是否是列头*/
                /*
                //获取当前选中单元格所在的列序号
                int columnindex = dgv.CurrentRow.Cells.IndexOf(dgv.CurrentCell);
                //获取获取当前选中单元格所在的行序号
                int rowindex = dgv.CurrentRow.Index;*/
                int columnindex = -1, rowindex = -1;
                int columnindextmp = -1, rowindextmp = -1;
                if (dgv.SelectedCells.Count != 0)
                {
                    columnindextmp = dgv.SelectedCells[0].ColumnIndex;
                    rowindextmp = dgv.SelectedCells[0].RowIndex;
                }
                //取到最左上角的 单元格编号
                foreach (DataGridViewCell cell in dgv.SelectedCells)
                {
                    //dgv.Rows[cell.RowIndex].Selected = true;
                    columnindex = cell.ColumnIndex;
                    if (columnindex > columnindextmp)
                    {
                        //交换
                        columnindex = columnindextmp;
                    }
                    else
                        columnindextmp = columnindex;
                    rowindex = cell.RowIndex;
                    if (rowindex > rowindextmp)
                    {
                        rowindex = rowindextmp;
                        rowindextmp = rowindex;
                    }
                    else
                        rowindextmp = rowindex;
                }
                if (kind == -1)
                {
                    columnindex = 0;
                    rowindex = 0;
                }

                //如果行数超过当前列表行数
                if (rowindex + rowNum + 1 > dgv.RowCount)
                {
                    int mm = rowNum + rowindex + 1 - dgv.RowCount;
                    for (int ii = 0; ii < mm + 1; ii++)
                    {
                        dgv.DataBindings.Clear();
                        DataRow row = dt2.NewRow();
                        dt2.Rows.InsertAt(row, ii + rowindex + 1);
                    }
                }

                //如果列数超过当前列表列数
                if (columnindex + columnNum + 1 > dgv.ColumnCount)
                {
                    int mmm = columnNum + columnindex + 1 - dgv.ColumnCount;
                    for (int iii = 0; iii < mmm; iii++)
                    {
                        dgv.DataBindings.Clear();
                        DataGridViewTextBoxColumn colum = new DataGridViewTextBoxColumn();
                        dgv.Columns.Insert(columnindex + 1, colum);
                    }
                }

                //增加超过的行列
                for (int j = 0; j < (rowNum + 1); j++)
                {
                    for (int colIndex = 0; colIndex < (columnNum + 1); colIndex++)
                    {
                        if (colIndex + columnindex < dgv.Columns.Count)
                        {
                            if (dgv.Columns[colIndex + columnindex].CellType.Name == "DataGridViewTextBoxCell")
                            {
                                if (dgv.Rows[j + rowindex].Cells[colIndex + columnindex].ReadOnly == false)
                                {
                                    dgv.Rows[j + rowindex].Cells[colIndex + columnindex].Value = data[j, colIndex];
                                    dgv.Rows[j + rowindex].Cells[colIndex + columnindex].Selected = true;
                                }
                            }
                        }
                    }
                }
                //清空剪切板内容
                if (b_cut)
                    Clipboard.Clear();
                return 1;
            }
            catch
            {
                return -1;
            }
        }

        private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
        #endregion


        private void 清空ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            dt2.Clear();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // 定义文件名
            string fileName = "1.png";
            // 确保文件存在
            if (File.Exists(fileName))
            {
                // 使用Process类启动默认程序来打开文件
                Process.Start(new ProcessStartInfo(fileName) { UseShellExecute = true });
            }
            else
            {
                // 如果文件不存在，则显示错误消息
                MessageBox.Show("文件不存在。", "错误");
            }
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // 定义文件名
            string fileName =(listBox1.SelectedIndex+1)+".png";
           // MessageBox.Show(listBox1.SelectedIndex.ToString());
            // 确保文件存在
            if (File.Exists(fileName))
            {
                // 使用Process类启动默认程序来打开文件
                Process.Start(new ProcessStartInfo(fileName) { UseShellExecute = true });
            }
            else
            {
                // 如果文件不存在，则显示错误消息
                MessageBox.Show("文件不存在。", "错误");
            }
        }

        private void listBox1_CursorChanged(object sender, EventArgs e)
        {

        }
    }
}
